package sessionBean;

import java.util.ArrayList;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entityBean.Cliente;
import entityBean.Pacchetto;

/**
 * Session Bean implementation class InfoClienteCtrl
 */
@Stateless(name="InfoClienteCtrl")
@Remote(InfoClienteCtrlRemote.class)
public class InfoClienteCtrl implements InfoClienteCtrlRemote {

	@PersistenceContext(name="cvproject")
	private EntityManager manager;
	
    /**
     * Default constructor. 
     */
    public InfoClienteCtrl() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public void disiscriviti(String codice) {

		//1) Elimino i pacchetti acquistati da quel cliente
		String s = "DELETE FROM pacchetto p WHERE p.acquirente=:codice";
		Query q = manager.createQuery(s);
		q.setParameter("codice", codice);
		q.executeUpdate();
		
		//2) Elimino il cliente
		Cliente c = manager.find(Cliente.class, codice);
		manager.remove(c);
		
	}

	@Override
	public Cliente modifica(Cliente c) {
		
		try {
			
			//Verifico se esiste un altro cliente con quello username
			String s = "FROM cliente c WHERE c.username=:username";
			Query q = manager.createQuery(s);
			q.setParameter("username", c.getUsername());
			
			q.getSingleResult();
			
			return null;
			
		}
		catch(EntityNotFoundException e) {
			
			//Non ha trovato un utente con quello username
			String x = "UPDATE cliente c SET c.telefono=:tel SET c.email=:email SET c.pagamento=:pag SET c.username=:user SET c.password=:pass WHERE c.codicefiscale=:cf";
			Query query = manager.createQuery(x);
			query.setParameter("tel", c.getTelefono());
			query.setParameter("email", c.getEmail());
			query.setParameter("pag", c.getPagamento());
			query.setParameter("user", c.getUsername());
			query.setParameter("pass", c.getPassword());
			query.setParameter("cf", c.getCodFis());
			query.executeUpdate();
			
			return getCliente(c.getCodFis());
			
		}
		
	}
	
	private Cliente getCliente(String codice) {
		
		//Cerco il cliente
		Cliente c = manager.find(Cliente.class, codice);
		
		try {
			
			//Cerco tutti i pacchetti che ha acquistato
			String s = "FROM pacchetto p WHERE p.acquirente=:codice";
			Query q = manager.createQuery(s);
			q.setParameter("codice", codice);
			
			ArrayList<Pacchetto> acquistati = new ArrayList<Pacchetto>(q.getResultList());
			
			c.setAcquistati(acquistati);
			
			return c;
			
		}
		catch(EntityNotFoundException e) {
			
			//Il cliente non ha ancora acquistato un pacchetto
			c.setAcquistati(null);
			
			return c;
			
		}
		
	}

}
